package br.com.sismo.server.dao.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.jdo.Query;

import br.com.sismo.server.entity.Usuario;
import br.com.sismo.shared.UsuarioTO;

public class UsuarioDAOImpl extends DAOImpl {
	public UsuarioDAOImpl() {
		super();
	}

	public Usuario findById(Long id) {
		return (Usuario) this.pm.getObjectById(Usuario.class, id);
	}	
	@SuppressWarnings("unchecked")
	public List<UsuarioTO> findByNome(String nome) {
		// query para a classe Usuario
		Query query = this.pm.newQuery(Usuario.class);
		// WHERE clause( o campo nome tem que ser igual ao parametro nomeParam )
		query.setFilter("nome == nomeParam");
		// indico qual o tipo do parametro 'nomeParam'
		query.declareParameters("String nomeParam");
		// executo a query passando o parametro
		List<Usuario> us = (List<Usuario>) query.execute(nome);
		return converteParaUsuarioTO(us);
	}	
	public void persist(Usuario u) {
		pm.currentTransaction().begin();
		pm.makePersistent(u);
		pm.currentTransaction().commit();
	}
	@SuppressWarnings("unchecked")
	public List<UsuarioTO> findAll() {
		Query query = this.pm.newQuery("select from "+Usuario.class.getName());
		List<Usuario> us = (List<Usuario>) query.execute();
		return converteParaUsuarioTO(us);
	}
	private List<UsuarioTO> converteParaUsuarioTO(Collection<Usuario> us) {
		List<UsuarioTO> usuarios = new ArrayList<UsuarioTO>();
		for(Usuario u : us) {
			usuarios.add(u.getUsuarioTO());
		}
		return usuarios;
	}
	@SuppressWarnings("unchecked")
	public int numUsuarios() {
		Query query = this.pm.newQuery("select from "+Usuario.class.getName());
		List<Usuario> us = (List<Usuario>) query.execute();
		return us.size();
	}
	public void removeUsuario(Long id) {
		Usuario u = findById(id);
		if(u == null) {
			return;
		}
		this.pm.currentTransaction().begin();
		this.pm.deletePersistent(u);
		this.pm.currentTransaction().commit();
	}
	@SuppressWarnings("unchecked")
	public List<UsuarioTO> findUsuariosById(List<Long> ids) {
		return (List<UsuarioTO>) this.pm.getObjectsById(ids);
	}
}
